//package com.fecean.aabbc.netty.message4;
//
//import com.fecean.aabbc.netty.handler4.NettyResponseChannelHandler;
//import io.netty.channel.Channel;
//import lombok.extern.slf4j.Slf4j;
//
//import java.time.Instant;
//import java.util.concurrent.CountDownLatch;
//import java.util.concurrent.Future;
//import java.util.concurrent.TimeUnit;
//
///**
// * ResponseFuture
// *
// * @author: chenfenghai
// * @version: 1.0
// * @date: 2020-03-13 13:37
// * @blame Team
// */
//@Slf4j
//public class ResponseFuture implements Future<MessageResponse> {
//
//    /**
//     ** 因为请求和响应是一一对应的，因此初始化CountDownLatch值为1。
//     */
//    private CountDownLatch countDownLatch = new CountDownLatch(1);
//
//    /**
//     ** Futrue的请求时间，用于计算Future是否超时
//     */
//    private long beginTimeMilli = Instant.now().toEpochMilli();
//
//    private Channel channel;
//
//    private MessageRequest request;
//
//    /**
//     ** 需要响应线程设置的响应结果
//     */
//    private MessageResponse response;
//
//    private ResponseFuture(){
//    }
//
//    public ResponseFuture(Channel channel, MessageRequest request){
//        this.channel = channel;
//        this.request = request;
//        init();
//    }
//
//    private void init(){
//        NettyResponseChannelHandler responseHandler = channel.pipeline().get(NettyResponseChannelHandler.class);
//        responseHandler.addResponseFuture(request.getId(), this);
//    }
//
//    @Override
//    public boolean cancel(boolean mayInterruptIfRunning) {
//        return false;
//    }
//
//    @Override
//    public boolean isCancelled() {
//        return false;
//    }
//
//    @Override
//    public boolean isDone() {
//        return response != null;
//    }
//
//    @Override
//    public MessageResponse get() {
//        try {
//            countDownLatch.await();
//        } catch (InterruptedException e) {
//            log.error("", e);
//        }
//        return this.response;
//    }
//
//    @Override
//    public MessageResponse get(long timeout, TimeUnit unit) {
//        try {
//            if(countDownLatch.await(timeout, unit)){
//                return this.response;
//            }
//        } catch (InterruptedException e) {
//            log.error("", e);
//        }
//        return null;
//    }
//
//    public void setResponse(MessageResponse response) {
//        this.response = response;
//        countDownLatch.countDown();
//    }
//
//    public long getBeginTimeMilli() {
//        return beginTimeMilli;
//    }
//}
